package cn.good.yan.basics.t1;

import cn.good.yan.BootApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 1. 配置类
 *    1 @Configuration 配置类
 *    2 @ConditionalOnBean 条件装配
 * @author shengren.yan
 * @create 2023-09-27
 */
// 该注解，告诉SpringBoot，这是配置类 = 配置文件
// proxyBeanMethods 为true 默认也是 true，保证 创建对象只有唯一一个，容器中只有唯一一个组件，保持组件的单实例
// proxyBeanMethods 为false 保证 创建对象并不是唯一的，每次都创建Bean ，保持组件的多实例
@Configuration(proxyBeanMethods = false)
//@Configuration
public class Con1 {

    // 给容器添加组件，相当于之前MVC 的 XML文件中的<bean></bean>的创建对象
    // 交给Springboot容器进行管理，只创建一次对象
    // @Bean("tom")  可以指定组件名，默认是方法名作为组件id
    @Bean
    public User user1() {
        return new User("xiao", 18);
    }

    // 演示 ： 测试 @Configuration 注解
    public static void main(String[] args) {
        // 1.返回IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(BootApplication.class, args);
        // 2.查看容器里的组件
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (String name : beanDefinitionNames){
            // 打印出默认已加载的容器
            System.out.println(name);
        }
        User user1 = run.getBean("user1", User.class);
        User user2 = run.getBean("user1", User.class);
        System.out.println(user1);
        // 结果为 true ，不管创建多少次，都只有一个对象
        System.out.println(user1==user2);
    }


    // 条件装配 - 当有改组件（user1），才加载该对象    @ConditionalOnBean
    //          当有改组件没有（user1），才加载该对象 @ConditionalOnMissingBean
    @ConditionalOnBean(name = "user1")
    @ConditionalOnMissingBean(name = "user1")
    @Bean
    public User user2() {
        return new User("xiao", 18);
    }

}
